﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanserClient;
using TankController.Dominio;

namespace TankController
{
    public partial class UcConfigurarPlanta : UserControl
    {
        private FormConfigurar formConfigurar;
        private Planta planta;
        private Cascata cascata;

        public Planta Planta
        {
            get { return planta; }
        }
        public Cascata Cascata
        {
            get { return cascata; }
        }

        public UcConfigurarPlanta()
        {
            InitializeComponent();

            MontarPortas();
        }

        public UcConfigurarPlanta(FormConfigurar formConfigurar)
            : this()
        {
            this.formConfigurar = formConfigurar;
        }

        private void MontarPortas()
        {
            for (int i = 0; i < Global.QTD_PORTAS; i++)
            {
                cbxPortaLeitura.Items.Add(i);
                cbxPortaLeituraSecundaria.Items.Add(i);
                cbxPortaEscrita.Items.Add(i);
            }

            if (Global.TipoConfiguracao == TipoConfiguracao.ConfiguracaoA)
            {
                cbxPortaLeitura.SelectedIndex = 0;
                cbxPortaLeituraSecundaria.SelectedIndex = 0;
            }
            else
            {
                cbxPortaLeitura.SelectedIndex = 1;
                cbxPortaLeituraSecundaria.SelectedIndex = 0;
            }

            cbxPortaEscrita.SelectedIndex = 0;
        }

        public void ValidarCampos()
        {
            double parseResultDouble;

            if (!double.TryParse(txtLimiteTensaoLow.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de limite de tensão inferior da planta inválido.");
            }

            if (!double.TryParse(txtLimiteTensaoHigh.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de limite de tesão superior da planta inválido.");
            }

            if (!double.TryParse(txtLimiteAlturaLow.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de limite de altura inferior da planta inválido.");
            }

            if (!double.TryParse(txtLimiteAlturaHigh.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de limite de altura superior da planta inválido.");
            }

            if (!double.TryParse(txtGanhoPotencialPlanta.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de ganho potencial da planta inválido.");
            }

            if (!double.TryParse(txtFatorConversao.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de fator de conversão da planta inválido.");
            }
        }

        public void MontarPlanta()
        {
            String ip = txtIP.Text;
            int porta = int.Parse(txtPorta.Text);
            int portaLeitura = (int)cbxPortaLeitura.SelectedItem;
            int portaLeituraSecundaria = (int)cbxPortaLeituraSecundaria.SelectedItem;
            int portaEscrita = (int)cbxPortaEscrita.SelectedItem;
            double limiteTensaoPlantaLow = double.Parse(txtLimiteTensaoLow.Text.Replace('.', ','));
            double limiteTensaoPlantaHigh = double.Parse(txtLimiteTensaoHigh.Text.Replace('.', ','));
            double limiteAlturaPlantaLow = double.Parse(txtLimiteAlturaLow.Text.Replace('.', ','));
            double limiteAlturaPlantaHigh = double.Parse(txtLimiteAlturaHigh.Text.Replace('.', ','));
            double fatorConversao = double.Parse(txtFatorConversao.Text.Replace('.', ','));
            double ganhoPotencial = double.Parse(txtGanhoPotencialPlanta.Text.Replace('.', ','));

            QuanserServer quanserServer = new QuanserServer(ip, porta);
            IQuanserClient servidor = new QuanserClient.QuanserClient(quanserServer);

            // Monta a planta física
            if (planta == null)
            {
                planta = new Planta();
            }

            planta.Servidor = servidor;
            planta.PortaLeitura = Global.TipoConfiguracao != TipoConfiguracao.ConfiguracaoC ? portaLeitura : portaLeituraSecundaria;
            planta.PortaLeituraSecundaria = portaLeituraSecundaria;
            planta.PortaEscrita = portaEscrita;
            planta.LimiteTensaoPlantaLow = limiteTensaoPlantaLow;
            planta.LimiteTensaoPlantaHigh = limiteTensaoPlantaHigh;
            planta.LimiteAlturaPlantaLow = limiteAlturaPlantaLow;
            planta.LimiteAlturaPlantaHigh = limiteAlturaPlantaHigh;
            planta.FatorConversao = fatorConversao;
            planta.GanhoPotencial = ganhoPotencial;

            if (Global.TipoConfiguracao == TipoConfiguracao.ConfiguracaoC)
            {
                // Monta a planta virtual
                if (cascata == null)
                {
                    cascata = new Cascata();
                }

                cascata.Servidor = servidor;
                cascata.PortaLeitura = portaLeitura;
                cascata.ValorAmplitude = 0;
                cascata.FatorConversao = fatorConversao;
                cascata.GanhoPotencial = ganhoPotencial;
            }
        }
    }
}
